/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GameAI;

import GameObject.Card;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Timer;

/**
 * Xữ lí trung tâm
 * @author NGUYEN VAN TAM
 */
public class CenterPlayer {
    public Point _center;
    public Point _left;
    public Point _right;
    public Point _bottom;
    public Point _top;
    
    public Player West;
    public Player North;
    public Player East;
    public Player South;
    
    //danh sách các lá bài hiện tại center đang gữa của người chơi
    public List<Card> listCard;
    public int nCard;
    MovingController movingController;
    
    //biến qui định trạng thai của center đang là chia bài hay đã hoàn tất
    boolean deal ;
    List<Card> lcardDeal;
            
    public void InitPointToInsertCard(Point center, Point top, Point right, Point bottom, Point left) {
        _center = center;
        _top = top;
        _right = right;
        _bottom = bottom;
        _left = left;
    }

    public void InitPlayer(Player w, Player n, Player t, Player y) {
        West = w;
        North = n;
        East = t;
        South = y;
    }

    public void InitCard(List<Card> listcard, int ncard, MovingController controller)
    {
        listCard = listcard;
        nCard = ncard;
        movingController = controller;
    }
    
    public void InitCardDeal(boolean dealing, List<Card> lCardDeal)
    {
        deal = dealing;
        lcardDeal = lCardDeal;
    }
    
    // Tạo thông tin thay đổi là một chuôi xml nếu là người chơi chính
    public String CreateInfoChange()
    {
        return null;
    }
    
    // Gửi thông tin thay đổi nếu là người chơi chính
    public  String SendMessageInfoChange()
    {
        return null;
    }

    // Nhận thông tin thay đổi là nước đi kế tiếp nếu không là người chơi chính
    public boolean RecieveMessageInfoChange(String message)
    {
        return false;
    }
    
    // Phát bài cho người chơi và trã về các lá bài cho người chơi, kết thúc khi không còn lá bài nào được phát
    public boolean DealCard()
    {
        List<Integer> lDealed = new ArrayList<Integer>();
        
        Random generator = new Random();
        for (int i = 0; i < lcardDeal.size(); i++) {
            int index = generator.nextInt(lcardDeal.size());
            if (i % 4 == 0) {
                South.RecieveCard(lcardDeal.get(index),_center);
            } else if (i % 4 == 1) {
                North.RecieveCard(lcardDeal.get(index),_center);
            } else if (i % 4 == 2) {
                East.RecieveCard(lcardDeal.get(index),_center);
            } else if (i % 4 == 3) {
                West.RecieveCard(lcardDeal.get(index),_center);
            }
            lDealed.add(i);
        }

        for (int i = 0; i < 4; i++) {
            lcardDeal.remove(i);
        }
        if(lcardDeal.isEmpty())
        {
            this.deal = false;
        }
        return true;
    }

    //nhận lá bài từ người chơi đánh ra
    public boolean ReceiveCard(Card card, SettingGameAI.Direction direction)
    {
        if(listCard.size() > nCard)
        {
            return false;
        }
        else 
        {
            listCard.add(card);
            if(direction == SettingGameAI.Direction.East)
            {
                movingController.AddMovingCard(card, _right);
            }
            if(direction == SettingGameAI.Direction.North)
            {
                movingController.AddMovingCard(card, _top);
            }
            if(direction == SettingGameAI.Direction.South)
            {
                movingController.AddMovingCard(card, _bottom);
            }
            if(direction == SettingGameAI.Direction.West)
            {
                movingController.AddMovingCard(card, _left);
            }  
        }
        return true;
    }
    
    // Kiểm tra xem các lá bài đã đũ hay chưa nếu đủ thì trã nó cho người chơi nào ăn
    public boolean SendCardToPlayer(SettingGameAI.Direction direction) {
        if(listCard.size() < nCard)
        {
            return false;
        }
        else if(listCard.size() == nCard)
        {
            if(direction == SettingGameAI.Direction.East)
            {
                for(int i = 0 ;i < nCard;i++)
                {
                    East.RecieveCard(listCard.get(i),_right);
                }
            }
            if(direction == SettingGameAI.Direction.North)
            {
                for(int i = 0 ;i < nCard;i++)
                {
                    North.RecieveCard(listCard.get(i),_top);
                }
            }
            if(direction == SettingGameAI.Direction.South)
            {
                for(int i = 0 ;i < nCard;i++)
                {
                    South.RecieveCard(listCard.get(i),_bottom);
                }
            }
            if(direction == SettingGameAI.Direction.West)
            {
                for(int i = 0 ;i < nCard;i++)
                {
                    West.RecieveCard(listCard.get(i),_left);
                }
            }  
            listCard.clear();
        }
        return true;
    }
    // Kiểm tra xem trong 4 lá bài người chơi phát ra ai sẽ là người nhận lá bài
    
    
    //update lại center là trung tâm đóng vài trò như người kiểm tra bài
    public void Update(Timer gameTime)
    {
        if(deal == false)
        {
            movingController.Move();
            for(int i = 0 ;i < nCard;i++)
            {
                listCard.get(i).Update(gameTime);
            }
        }
        else 
        {
            DealCard();
        }
    }

    public void Draw(Timer gameTime, Graphics2D graphic) {
        if(deal == false)
        {
            for(int i = 0 ;i < nCard;i++)
            {
                listCard.get(i).Draw(gameTime, graphic);
            }
        }
        else 
        {
            lcardDeal.get(0).Draw(gameTime, graphic);
        }
    }
}
